Forum des exercices du projet Zuul

Exercice 7.48

  
 
Avatar Denis BUREAU
Exercice 7.48
par Denis BUREAU, mardi 19 novembre 2013, 15:33
 

Add characters to the game. Characters are similar to items, but they can talk. They speak some text when you first meet them, and they may give you some help if you give them the right item.

Attention ! Il est probable que le concept de personnage évolue vers une certaine autonomie dans les exercices suivants, donc il sera de moins en moins proche d'un Item.

Avatar Denis BUREAU
Re: Exercice 7.48
par Denis BUREAU, mardi 19 novembre 2013, 15:34
 

Un étudiant a écrit :

Bonjour,
Je dois créer la classe Character, et permettre aux character de parler au personnage quand il rentre dans la même pièce que les character.
J'ai pensé stocker l'emplacement du character dans le character lui même, mais du coup je ne sais pas comment faire pour qu'une autre classe (le personnage, ou le game engine) puisse dire au character de parler à ce moment là. Pouvez vous m'aider à trouver comment faire, ou m'indiquer si je m'y prend mal, s'il vous plait?
Cordialement.

Avatar Denis BUREAU
Re: Exercice 7.48
par Denis BUREAU, mardi 19 novembre 2013, 15:35
 

Plusieurs solutions sont possibles.

Il paraît normal que chaque personnage sache dans quelle pièce il est.

Par contre, on peut aussi bien imaginer que le GameEngine connaisse la liste de tous les personnages (et éventuellement leur demande dans quelle pièce ils sont) ou bien que chaque Room connaisse la liste (éventuellement vide) des personnages qui s'y trouvent.

En tous cas, lorsqu'on rentre dans une pièce, la liste des personnages présents doit s'afficher.

Ceux-ci peuvent parler de leur propre initiative ou bien attendre qu'une commande talk soit tapée.

Avatar William AFONSO
Re: Exercice 7.48
par William AFONSO, jeudi 29 mai 2014, 21:32
 

Les Characters ne sont-ils pas des sortes de Players?

 D'ailleurs, ne sont-ils pas même des Player?

Avatar Denis BUREAU
Re: Exercice 7.48
par Denis BUREAU, vendredi 30 mai 2014, 11:46
 

On a l'habitude de les appeler NPC : Non Playing Characters ou PNJ : Personnages Non Joueurs.

Il y a des tas de choses que le Player doit savoir faire alors que les NPC non.

Par contre, on pourrait imaginer un AbstractCharacter qui contiendrait les points communs entre le Player et les NPC ...

Avatar William AFONSO
Re: Exercice 7.48
par William AFONSO, mardi 3 juin 2014, 20:22
 

Tout ce qu'un PNJ peut faire, un player peut le faire, non?

Ainsi, pourquoi ne pas faire directement une classe Character(représentant les personnages non joueurs), dont hériterait la classe Player?

 

Avatar Denis BUREAU
Re: Exercice 7.48
par Denis BUREAU, mardi 3 juin 2014, 21:48
 

Tout simplement par ce qu'un Joueur n'est pas une sorte de Non Joueur ...

Avatar Denis BUREAU
Re: Exercice 7.48
par Denis BUREAU, mardi 3 juin 2014, 21:50
 

L'étudiant a répondu :

J'ai donc fait une classe abstraite Abstractcharacter.

Etant donné qu'Abstractcharacter est non instanciable (abstraite), est-on forcé de créer deux attributs de types: liste de Player et list de PNJ ou est-ce qu'il est possible de créer une liste combinant les deux?

Avatar Denis BUREAU
Re: Exercice 7.48
par Denis BUREAU, mardi 3 juin 2014, 21:51
 

Tout ce qui peut être mis en commun entre Player et PNJ doit l'être dans AbstractCharacter.

Avatar Denis BUREAU
Re: Exercice 7.48
par Denis BUREAU, jeudi 5 juin 2014, 23:16
 

Un étudiant a écrit :

J'ai conféré à mes rooms un attribut de type PnjList.
Toutefois, comment savoir à quel Pnj on va donner un objet lorsque l'on appelle la commande DonnerCommand() ?
Faut-il modifier le parser de façon à récupérer un troisième mot? Mais cette solution semble un peu laborieuse, car il faudrait alors modifier toutes les commandes.
Faut-il donc éviter une PnjList et préférer de ne mettre qu'un seul Pnj dans une salle, qui serait d'ailleurs stocké dans un de ses attributs (à la salle) ?
Ou bien est-ce-qu'une commande donner n'est pas conseillée pour notre projet?

Par ailleurs, pour que chaque Pnj réagisse différemment à chaque action, est-il judicieux de créer des sous classes de Pnj, en redéfinissant à chaque fois une méthode SpecificMethod?
 
Avatar Denis BUREAU
Re: Exercice 7.48
par Denis BUREAU, jeudi 5 juin 2014, 23:28
 

On ne peut pas imposer qu'il n'y ait qu'un seul personnage par pièce.

Cela provoque effectivement pas mal de changements de prévoir 3 mots dans une commande, mais ce n'est pas inaccessible (il ne faudrait pas modifier TOUTES les classes de commande).

Une solution moins élégante est de faire le don en 2 temps (donc 2 commandes), par exemple : give pencil puis to Jack, mais il faudra gérer le cas ou le joueur tape to sans avoir tapé give, ou bien accepter les 2 sens, et réinitialiser la situation à chaque déplacement..

La commande 'donner' n'est pas obligatoire.

Pour votre dernière question, les sous-classes sont toujours un moyen élégant de résoudre ce genre de problème. Par contre, ce serait trop lourd, si la seule différence de réaction du personnage tenait dans le message qu'il délivre.

Avatar Camille DE PINHO
Re: Exercice 7.48
par Camille DE PINHO, samedi 6 juin 2015, 13:26
 

Bonjour,

Je rencontre un problème: pour créer une classe AbstractCharacter dont hériteraient Player et Character, j'ai besoin de déplacer ma classe Player de son paquetage pkg_game vers pkg_elements.pkg_characters.

Mon problème survient lorsque je déplace la classe Player. Tant qu'elle est dans pkg_game (contenant également GameEngine et Parser), le jeu fonctionne très bien. Mais dès que je déplace la classe Player dans pkg_elements.pkg_characters, le jeu ne fonctionne plus: lorsque je le lance et entre une commande aller ou prendre, par exemple, cette erreur survient:

Exception in thread "AWT-EventQueue-0" java.lang.NoSuchMethodError: pkg_game.GameEngine.getPlayer()Lpkg_game/Player;

J'ai pourtant bien ajouté dans les classes en ayant besoin, la ligne import pkg_elements.pkg_characters.Player;

L'erreur survient aux lignes appelant des méthodes de la classe Player, mais je ne comprends pas pourquoi puisque ces méthodes sont bel et bien dans Player, et que je n'ai jamais eu ce souci auparavant, y compris à l'exercice 7.47.1 où la quasi-totalité des classes change pourtant de paquetage. Que faire pour corriger l'erreur?

Avatar Denis BUREAU
Re: Exercice 7.48
par Denis BUREAU, lundi 8 juin 2015, 11:57
 

Suite à un pb technique, je viens seulement d'être prévenu de votre message.

A mon avis, il suffit de faire Rebuild package dans chaque paquetage, y compris éventuellement plusieurs fois sur le même paquetage jusqu'à ce qu'il n'y ait plus d'erreurs de compilation.

Si le pb n'est toujours pas résolu, mettez votre jeu sur votre compte esiee et venez me voir en 5356.

Avatar Denis BUREAU
Re: Exercice 7.48
par Denis BUREAU, lundi 16 mai 2016, 22:23
 

Un étudiant a écrit :

Je travaille actuellement sur l'exercice 7.48, et après avoir créé une classe Character, je tente de placer ce dernier dans le createRooms à l'instar des items et des sorties. 

Cependant, à la ligne 
"Character vMoine = new Character(...);" 
une erreur apparaît à la compilation:

"reference to Character is ambiguous
both class pkg_Corps.Character in pkg_Corps and class java.lang.Character in java.lang match"

Il semblerait que le jeu confonde ma classe Character qui représente les npc avec la class Character qui représente les "caractères".
Dois-je pour cela renommer ma classe Character en par exemple Npc?
Avatar Denis BUREAU
Re: Exercice 7.48
par Denis BUREAU, lundi 16 mai 2016, 22:22
 

Effectivement, il faut soit renommer votre classe, soit écrire :

pkg_Corps.Character vMoine = new pkg_Corps.Character(...);

Avatar Denis BUREAU
Re: Exercice 7.48
par Denis BUREAU, vendredi 27 mai 2016, 17:05
 

Un étudiant a écrit :

J'ai plusieurs questions concernant l'exercice 7.48.
J'ai créé mes Characters ainsi que la commande Talk.
Vous demandez de plus à ce que ces personnages puissent donner de l'aide lorsqu'on leur donne un objet.
Doivent-ils donc posséder un inventaire? Ou bien il suffit simplement de retirer l'objet en question de notre inventaire?
De plus, en quoi consiste l'aide apportée par le personnage? Un simple message d'aide?

Merci d'avance pour votre réponse,


Avatar Denis BUREAU
Re: Exercice 7.48
par Denis BUREAU, vendredi 27 mai 2016, 17:26
 

1) Étant donné que l'énoncé emploie le verbe 'may', nous ne retirerons pas de points si on ne peut pas donner d'objets aux PNJ.

2) Si vous prévoyez cette possibilité, vous pouvez choisir la solution simple (sans inventaire) ou plus élaborée (avec inventaire).

3) En ce qui concerne l'aide, la solution la plus simple est bien un message, mais s'il possède un inventaire, un PNJ pourrait donner un objet au joueur, ou effectuer toute autre action que vous pouvez imaginer.

Avatar Denis BUREAU
Re: Exercice 7.48
par Denis BUREAU, mardi 4 mai 2021, 17:58
 

Un étudiant a écrit :

1)
Je suis en train d’essayer de faire l’exercice 7.48 afin d’ajouter à mon jeu les différents personnages. Je me demandais s’il était obligatoire de créer une classe AbstracCharacter (comme il n’y a que les méthodes relatives aux Items qui sera dans les deux classes Character et Player).

2)
Aussi, concernant les dialogues, je me demandais comment les implémenter et avec quel type de méthode. En effet, je ne veux pas que certains personnages répètent à chaque rencontre leurs phrases d’introduction, je voudrai qu’ils disent une certaine phrase en fonction de si le joueur les rencontre pour une première fois ou une 5e fois, les phrases ne seront pas les mêmes.

Avatar Denis BUREAU
Re: Exercice 7.48
par Denis BUREAU, mardi 4 mai 2021, 18:03
 

1)
Ce n'est pas "obligatoire". Par contre, si de plus en plus d'attributs deviennent communs entre Player et Character, cela indiquera qu'il vaut mieux qu'elles héritent toutes deux d'une classe AbstractCharacter.

2)
S'il y a plusieurs phrases, il suffit de les mettre dans un tableau, et d'avoir un compteur qui s'incrémente à chaque fois qu'on en utilise une.